#include<iostream>
#include<sstream>
#include<string>
#include<memory>
#include<jsoncpp/json/json.h>

int main()
{
    const char *name="小明";
    int age=18;
    float score[]={77.5,88,93.6};

    Json::Value root;
    root["姓名"]=name;
    root["年龄"]=18;
    root["成绩"].append(score[0]);//数组元素就使用append添加
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);

    Json::StreamWriterBuilder swb;//声明一个StreamWriterBuilder类型的对象
    //这行代码主要是swb.newStreamWriter()这个方法，定义了一个StreamWriter类型的匿名对象,这个对象拷贝给sw
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());//sw会在程序结束后自动释放，
    std::stringstream ss;//定义一个流，用来接收序列化后的数据
    sw->write(root,&ss);//调用sw的write方法序列化
    std::cout<<ss.str()<<std::endl;
    std::cout<<"___________________________"<<std::endl;
    
    //反序列化
    std::string str =R"({"姓名":"小黑","年龄":19,"成绩":[58.5,56,59]})";
    Json::Value root1;//存放反序列化后的数据用的对象
    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
    std::string err;//存放错误信息
    //参数列表：一大行字符串的起始地址，终止地址，存放在哪，记录错误信息
    bool ret=cr->parse(str.c_str(),str.c_str()+str.size(),&root1,&err);
    if(ret==false)
    {
        std::cout<<"parse error: "<<err<<std::endl;
        return -1;
    }
    std::cout<<root1["姓名"].asString()<<std::endl;
    std::cout<<root1["年龄"].asInt()<<std::endl;
    int sz=root1["成绩"].size();
    for(int i=0;i<sz;i++)
    {
        std::cout<<root["成绩"][i]<<std::endl;
    }
    return 0;
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}